// @algorithm @lc id=3 lang=cpp
// @title longest-substring-without-repeating-characters

#include <iostream>
#include <vector>
#include <string>
#include "algm/algm.h"
using namespace std;
// @test("abcabcbb")=3
// @test("bbbbb")=1
// @test("pwwkew")=3

/**
 * @brief
 * 使用滑动窗口的思想, 设定窗口为[l_limit, r_limit]
 * 每次向右移动删除l_limit-1, 同时让r_limit向右拓展直到r_limit+1不满足需求即可得到窗口
 * 子串的下标区间[l_limit, r_limit], 同时也是[l_limit, r_limit + 1)
 */
class Solution {
public:
    int lengthOfLongestSubstring(string s)
    {
        int                res     = 0;
        int                r_limit = -1; //先假设一个元素都没有, 所以区间为[0, -1], 即[0, 0)
        int                len     = s.size();
        unordered_set<int> set;
        for (int l_limit = 0; l_limit < len; l_limit++) {
            if (l_limit > 0)
                set.erase(s[l_limit - 1]);
            for (; r_limit + 1 < len && set.count(s[r_limit + 1]) == 0; r_limit++)
                set.insert(s[r_limit + 1]);
            if (set.size() > res)
                res = set.size();
        }
        return res;
    }
};